package com.mkx.configurations;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * 配置管理器 (ConfigManager)
 * 负责管理所有的自动配置实现
 * 提供注册配置、排序配置和应用配置的功能
 * 实现了单例模式以确保全局只有一个配置管理器实例
 */
public class ConfigManager {
    
    // 单例实例
    private static final ConfigManager INSTANCE = new ConfigManager();
    
    // 存储所有的自动配置实现
    private final List<AutoConfig> configs = new ArrayList<>();
    
    /**
     * 私有构造方法，防止外部创建实例
     */
    private ConfigManager() {
    }
    
    /**
     * 获取配置管理器的单例实例
     * @return 配置管理器实例
     */
    public static ConfigManager getInstance() {
        return INSTANCE;
    }
    
    /**
     * 注册一个自动配置
     * @param config 要注册的自动配置
     */
    public void register(AutoConfig config) {
        if (config != null) {
            configs.add(config);
            System.out.println("已注册配置: " + config.getName() + "，优先级: " + config.getOrder());
        }
    }
    
    /**
     * 应用所有应该应用的配置
     * 先按照优先级排序，然后应用所有shouldApply()返回true的配置
     */
    public void applyConfigurations() {
        // 按照优先级排序配置，优先级值越小的配置越先被应用
        Collections.sort(configs, Comparator.comparingInt(AutoConfig::getOrder));
        
        System.out.println("开始应用配置...");
        
        // 遍历所有配置，应用应该应用的配置
        for (AutoConfig config : configs) {
            if (config.shouldApply()) {
                System.out.println("应用配置: " + config.getName());
                config.apply();
            } else {
                System.out.println("跳过配置: " + config.getName());
            }
        }
        
        System.out.println("配置应用完成");
    }
    
    /**
     * 获取所有已注册的配置
     * @return 已注册配置的列表
     */
    public List<AutoConfig> getConfigs() {
        return Collections.unmodifiableList(configs);
    }
}